import { useWebSocket } from "@vueuse/core";
import { useUserStoreHook } from "@/store/modules/user";
import { notify } from "./wsnotify";
const { VITE_API_URL } = import.meta.env;
let apiBaseUrl = VITE_API_URL;
// ws地址
const url = apiBaseUrl.replaceAll("http", "ws");
const wsInstance = ref(null);

const initOptions = {
  onConnected: function (ws) {
    console.log("websocket 连接成功！", ws.url);
  },
  onMessage: function (ws, event) {
    const eventData = event.data;
    const message = JSON.parse(eventData);
    notify(message);
  },
  // 每隔x毫秒发送一次心跳,heartbeat默认为false
  // heartbeat: true,
  // heartbeat: {
  //   message: 'ping', // 心跳消息
  //   responseMessage: '', // 心跳的响应消息，如果未定义，将使用该消息
  //   interval: 1000, // 间隔(毫秒)
  //   pongTimeout: 1000, // 心跳响应超时，以毫秒为单位,默认为1000
  // },
  /*
   * 不使用心跳，根据后台实际逻辑来，有时候发送心跳，不会返回任何数据，但是不会断开
   * 如果设置为 true，表示需要心跳，发送心跳后，后台一定要返回信息，不然就会断开重连
   * */
  // heartbeat: {
  //   interval: 30 * 1000, // 心跳间隔时间
  //   pongTimeout: 10 * 1000 // 响应超时时间
  // },
  // autoReconnect: true,
  autoReconnect: {
    retries: 3,
    delay: 5000,
    onFailed() {
      console.log("Failed to connect WebSocket after 3 retires");
    }
  },
  autoClose: false // 自动关闭连接
};

export function reconnect() {
  if (wsInstance.value) {
    const reconnectInterval = setInterval(() => {
      if (wsInstance.value.status === "OPEN") {
        // 1 表示 WebSocket 连接已成功打开
        console.log("WebSocket 已重新连接");
        clearInterval(reconnectInterval); // 重连成功后清除重连尝试
      } else {
        console.log("正在尝试重新连接 WebSocket...");
        open(); // 尝试手动重新打开 WebSocket 连接
      }
    }, 5000); // 每隔5秒尝试重新连接并发送数据
  }
}

export function sendMessage(content: string) {
  if (wsInstance.value) {
    wsInstance.value.send(content);
  }
}

export function closeConnect() {
  if (wsInstance.value) {
    console.log("websocket 断开连接！", wsInstance.value.ws.url);
    wsInstance.value.close();
    wsInstance.value = null;
  }
}

export function initConnect() {
  const userid = useUserStoreHook().getUserid;
  const wsUrl = `${url}/websocket/${userid}`;
  const { status, close, open, send, ws } = useWebSocket(wsUrl, initOptions);
  wsInstance.value = { status, close, open, send, ws };
}
